package kotlinquanweizhinan.chapt09.let

class test {
}

fun main() {
    //let函数示例，用来求集合里第一个数的平方值
    val firstItemSquared = listOf(1,2,3).first().let {
        it * it
    }
    //不使用let函数
    val firstElement = listOf(1,2,3).first()
    val firstItemSquared1 = firstElement * firstElement

    /*
    *如果结合其他Kotlin语法特性使用，那么let更显便利。结合使用let与第6单学过的空合并运算符，
    * 可以方便地处理可空类型值。例如，要判断小客栈老板接待的是不是老顾客，并据此给出不同的欢迎
    * 信息，你可以考虑以下代码实现
    * */
    fun formatGreeting(vipGuest:String?):String{
        return vipGuest?.let{
            "Welecome,$it.Please, go straight back - your table is read."
        }?:"Welecome to the tavern.You'll be seated soon."
    }

    //以下是没用let函数的formatGreeting实现，式处上便比较一下.
    fun formatGreeteing1(vipGuest:String?):String{
        return if(vipGuest != null){
            "Welecome,$vipGuest.Please, go straight back - your table is read."
        }else{
            "Welecome to the tavern.You'll be seated soon."
        }
    }

    /*
    * 值得一提的是,let和apply用法上有几点不一样。看前面的例子可知，let会把接收者传给lambda,而apply什么都不传。
    * 另外，匿名函数执行完，apply会返回当前接收者，而let会返回lambda的最后一行(lambda结果值).
    * 便let这样的标准函数还可以用来防止变量被小小心修改，因为let传给lambda的值参数是只读参数。
    * */
}